package org.rainy.gift.service.impl;

import org.rainy.gift.AuthClient;
import org.rainy.gift.domain.Employee;
import org.rainy.gift.domain.LoginUser;
import org.rainy.gift.domain.Tenant;
import org.rainy.gift.dto.TenantAdminDTO;
import org.rainy.gift.dto.TenantRegisterDTO;
import org.rainy.gift.exception.BusinessException;
import org.rainy.gift.exception.ResponseCode;
import org.rainy.gift.exception.RonghuaAssert;
import org.rainy.gift.mapper.EmployeeMapper;
import org.rainy.gift.mapper.TenantMapper;
import org.rainy.gift.service.ITenantService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.rainy.gift.util.AjaxResult;
import org.rainy.gift.util.BaiduAuditUtils;
import org.rainy.gift.util.EmailUtil;
import org.rainy.gift.util.encrypt.MD5;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;

/**
 * <p>
 * 服务实现类
 * </p>
 * @author rainy
 * @since 2024-06-01
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {

    @Autowired
    private TenantMapper tenantMapper;
    @Autowired
    private EmployeeMapper employeeMapper;
    @Autowired
    private EmailUtil emailUtil;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    private AuthClient authClient;
    /**
     * 租户入驻
     * 1. 参数校验
     * 参数非空校验-必填项都要做校验，返回错误信息入驻信息不完整，请检查后重新提交
     * 两次密码比对，返回错误信息两次密码不一致，请检查后重新提交
     * 检验店铺名称不能重复：根据店铺名称作为查询条件查询信息
     * 2.保存租户名称到数据库
     * 3.保存管理员信息到数据库
     * 通过管理员手机号和邮箱获取员工信息
     * 如果员工信息已存在，将该员工的ID和新增店铺ID，存入中间表
     * 如果员工信息不存在，则新增管理员信息，并将新增管理员的ID和新增店铺ID存入中间表
     * 4.如何将当前店铺管理员信息已经存在
     * 方案一：如果店铺管理员信息已经存在，可以直接返回一个错误信息，提示该管理员已存在，请直接添加店铺信息
     * 方案二：如果管理员信息已存在，就直接使用这个已存在的管理员信息的id，和新增店铺的ID保存进中间表
     * 5.对租户入驻信息做自动审核
     * 6.如果审核通过，将租户状态修改为待激活，添加店铺操作日志，然后就发送一封激活邮件
     * 7.如果审核未通过，将租户状态修改为驳回，添加店铺操作日志，发送一封入驻失败的邮件，告知失败原因
     * @param tenantRegisterDTO
     */
    @Override
    @Transactional
    public void settlement(TenantRegisterDTO tenantRegisterDTO) {
        TenantAdminDTO admin = tenantRegisterDTO.getAdmin();
        //参数校验
        RonghuaAssert.isEq(admin.getPassword(), admin.getConfirmPassword(), ResponseCode.RESPONSE_CODE_10010);
        Tenant tenantInDB = tenantMapper.loadByName(tenantRegisterDTO.getName());
        RonghuaAssert.isNull(tenantInDB, "店铺名称已存在,请重新输入!");
        //进行审核
        List<String> texts = Arrays.asList(tenantRegisterDTO.getAddress(), tenantRegisterDTO.getName());
        List<String> imgs = Arrays.asList(tenantRegisterDTO.getLogo());
        Map<String, Object> resultMap = BaiduAuditUtils.censor(texts, imgs);
        Boolean flag = (Boolean) resultMap.get("success");
        Tenant tenant = new Tenant();
        BeanUtils.copyProperties(tenantRegisterDTO, tenant);
        tenant.setRegisterTime(new Date());
        if (flag) {
            tenant.setState(1);//审核通过，待激活
        }else{
            tenant.setState(2);//审核失败
        }
        tenantMapper.insert(tenant);
        Employee adminByDb = employeeMapper.loadByPhone(admin.getPhone());
        Employee employee = new Employee();
        employee.setTenantId(tenant.getId());
        employee.setType(3);
        if(Objects.isNull(adminByDb)){
            LoginUser loginUser = new LoginUser();
            loginUser.setUsername(admin.getUsername());
            loginUser.setPhone(admin.getPhone());
            String salt = UUID.randomUUID().toString().replaceAll("-","");
            String password = MD5.getMD5("rainy" + salt + admin.getPassword() + "123");
            loginUser.setSalt(salt);
            loginUser.setPassword(password);
            loginUser.setType(0);
            AjaxResult ajaxResult = authClient.addOrUpdate(loginUser);
            if(!ajaxResult.isSuccess()){
                //远程调用授权服务保存登录信息,有可能会报错不成功,如果报错我们就抛出异常,阻止程序继续往下运行
                throw new BusinessException(ajaxResult.getMessage());
            }
            Long loginId = Long.valueOf(ajaxResult.getResultObj().toString());
            adminByDb = new Employee();
            BeanUtils.copyProperties(admin, adminByDb);
            employeeMapper.insert(adminByDb);
        }
        employee.setId(adminByDb.getId());
        employeeMapper.insert(employee);
        if (flag) {
            emailUtil.sendSimpleEmail("1984289228@qq.com", "审核成功","请您激活");
        } else {
            emailUtil.sendSimpleEmail("1984289228@qq.com", "审核失败", "请重新提交材料");
        }
    }
}


